package com.exde.wcsiapp.gps;

import android.util.Log;

import org.json.JSONObject;

import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;

public class HttpUtil {
    public static  void postJson(final String url, final Map<String,Object> map) {
        new Thread(){
            public void run(){
                try {
                    URL mUrl = new URL(url);
                    HttpURLConnection mHttpURLConnection = (HttpURLConnection) mUrl.openConnection();
                    //设置链接超时时间
                    mHttpURLConnection.setConnectTimeout(15000);
                    //设置读取超时时间
                    mHttpURLConnection.setReadTimeout(15000);
                    //设置请求参数
                    mHttpURLConnection.setRequestMethod("POST");
                    //添加Header
                    mHttpURLConnection.setRequestProperty("Content-type","application/x-java-serialized-object");
                    //接收输入流
                    mHttpURLConnection.setDoInput(true);
                    //传递参数时需要开启
                    mHttpURLConnection.setDoOutput(true);
                    //Post方式不能缓存,需手动设置为false
                    mHttpURLConnection.setUseCaches(false);

                    mHttpURLConnection.connect();

                    JSONObject json = new JSONObject();//创建json对象


                    for (Map.Entry<String, Object> entry : map.entrySet()) {
                        Log.d("ForTrajectory",entry.getKey() + ":" + entry.getValue());
                        json.put(entry.getKey().toString(), URLEncoder.encode(entry.getValue().toString(), "UTF-8"));//使用URLEncoder.encode对特殊和不可见字符进行编码
                    }

//                    json.put("longitude", URLEncoder.encode(map.get("longitude").toString(), "UTF-8"));//使用URLEncoder.encode对特殊和不可见字符进行编码
//                    json.put("latitude", URLEncoder.encode(map.get("latitude").toString(), "UTF-8"));//使用URLEncoder.encode对特殊和不可见字符进行编码
//                    json.put("name", URLEncoder.encode("哈哈", "UTF-8"));//使用URLEncoder.encode对特殊和不可见字符进行编码

                    String jsonstr = json.toString();//把JSON对象按JSON的编码格式转换为字符串

                    Log.d("ForTrajectory", "run: "+jsonstr);
                    //------------字符流写入数据------------
                    OutputStream out = mHttpURLConnection.getOutputStream();//输出流，用来发送请求，http请求实际上直到这个函数里面才正式发送出去
                    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));//创建字符流对象并用高效缓冲流包装它，便获得最高的效率,发送的是字符串推荐用字符流，其它数据就用字节流
                    bw.write(jsonstr);//把json字符串写入缓冲区中
                    bw.flush();//刷新缓冲区，把数据发送出去，这步很重要
                    out.close();
                    bw.close();//使用完关闭


                    // 获取代码返回值
                    int respondCode = mHttpURLConnection.getResponseCode();
                    // 获取返回内容类型
                    String type = mHttpURLConnection.getContentType();
                    // 获取返回内容的字符编码
                    String encoding = mHttpURLConnection.getContentEncoding();
                    // 获取返回内容长度，单位字节
                    int length = mHttpURLConnection.getContentLength();
                    //            // 获取头信息的Key
                    //            String key = mHttpURLConnection.getHeaderField(idx);
                    //            Log.d("key", "key="+key);
                    // 获取完整的头信息Map
                    Map<String, List<String>> map = mHttpURLConnection.getHeaderFields();
                    if (respondCode == 200) {
                        // 获取响应的输入流对象
                        InputStream is = mHttpURLConnection.getInputStream();
                        // 创建字节输出流对象
                        ByteArrayOutputStream message = new ByteArrayOutputStream();
                        // 定义读取的长度
                        int len = 0;
                        // 定义缓冲区
                        byte buffer[] = new byte[1024];
                        // 按照缓冲区的大小，循环读取
                        while ((len = is.read(buffer)) != -1) {
                            // 根据读取的长度写入到os对象中
                            message.write(buffer, 0, len);
                        }
                        // 释放资源
                        is.close();
                        message.close();
                        return;
                    }
                    return;
                }catch(Exception e){
                    Log.d("ForTrajectory", "Exception: "+e.toString());
                    return;
                }

            }
        }.start();
    }

}
